package top.lshaci.learning.singleton;

import lombok.AccessLevel;
import lombok.NoArgsConstructor;

/**
 * DoubleCheck
 * <pre>
 *     双重检查
 *     1) Double-Check概览是多线程开发中常使用到的，如代码所示，
 *        我们进行了两次if(singleton == null)检查，这样就可以保证线程安全了
 *     2) 这样，实例化代码只用执行一次，后面再次访问时，判断inf(singleton == null)，
 *        直接return实例化对象，也避免反复进行方法同步
 *     3) 线程安全，延迟加载，效率高
 * </pre>
 *
 * @author lshaci
 * @since 1.0.0
 */
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class DoubleCheck {

    private static volatile DoubleCheck singleton;

    public static DoubleCheck instance() {
        if (singleton == null) {
            synchronized (DoubleCheck.class) {
                if (singleton == null) {
                    singleton = new DoubleCheck();
                }
            }
        }
        return singleton;
    }
}
